// js继承演示
class Animal {
    color;
    name;
    master;
    constructor({ color, name, master } = {}) {
        this.color = color;
        this.name = name;
        this.master = master;
    }
    eat() {
        console.log("吃");
    }
    look() {
        console.log("都能看");
    }
}

// 狗
class Dog extends Animal {
    behavior = "狗自己的行为";
    constructor(name, color, master) {
        super({ name: name, color: color, master: master });
    }
    // 重写父方法
    eat() {
        console.log("狗吃肉");
    }
    // 自己的方法
    otherBehavior() {
        console.log(this.behavior);
    }
}
// 猫
class Cat extends Animal {
    hair = "棕色的毛";
    constructor() {
        super();
    }
    // 重写父方法
    eat() {
        console.log("猫吃鱼");
    }
    // 自己的方法
    lickingHair() {
        console.log(`舔${this.hair}`);
    }
}
// 实例化狗
let ww = new Dog();
console.log(ww);
ww.otherBehavior(); //狗自己的行为
// 实例化猫
let huahua = new Cat();
console.log(huahua);
huahua.lickingHair(); //舔棕色的毛





/**
 * 多态
 * 要想实现一个有用的多态, 子类方法需要重写父方法
 * 常规的多态应该是实现一个interface
 * js中不能implement一个interface
 * typescript中可以
 */
function whoEat(animal) {
    if (animal.eat instanceof Function) {
        animal.eat();
    }
}
whoEat(huahua); // 猫吃鱼
whoEat(ww); // 狗吃肉